Now that the meta data is organized, I can pretty clearly see that some of the issues are caused by juvenile samples.

Let’s re-run the analysis with them removed, as a test case.

Load libraries and data

library(tidyverse)
library(rubias)
# meta data
meta <- readRDS("../new_baseline_data/processed/meta-data-tibble.rds")
# genotype data in 2-column format for rubias
new2col <- read_csv("csv_outputs/new2col.csv")
Parsed with column specification:
cols(
  .default = col_integer(),
  sample_type = col_character(),
  repunit = col_character(),
  collection = col_character(),
  indiv = col_character()
)
See spec(...) for full column specifications.

How many of those are juveniles?

There are 160 juvenile samples

If I remove samples that are juveniles, what are my numbers per species?

new2col %>%
  semi_join(., meta, by = c("indiv" = "NMFS_DNA_ID")) %>%
  #anti_join(., juvies, by = "indiv") %>%
  group_by(collection) %>%
  tally() %>%
  rename(total_samples = n) %>%
  left_join(., juv_samples, by = "collection") %>%
  mutate(remaining_samples = total_samples-juv_samples) %>%
  arrange(remaining_samples)

We lose reedi and wilsoni when we exclude juveniles, and drop down to just 2 samples of crameri and five of serriceps.

However, generally including juveniles is a bad idea. So here’s what I’ll do: For any species for which we end up with fewer than 5 samples, I will include juveniles up to that number.

Now that I have those samples selected, I can remove all juvenile samples and put back those from the juvs_to_keep

Keeping just the juveniles from those three species, we have a total of 1,534 samples from 54 species.

Let’s try out the self-assignment with that dataset:

minus_juvs_selfass <- self_assign(dataset, gen_start_col = 5)
Summary Statistics:

1534 Individuals in Sample

90 Loci: Plate_1_A01_Sat_GW603857_consensus.1, Plate_1_A11_Sat_GE820299_consensus.1, Plate_2_A09_Sat_EW986980_consensus.1, Plate_2_C08_Sat_EW987116_consensus.1, Plate_2_G06_Sat_EW987118_consensus.1, Plate_3_C03_Sat_GE798118_consensus.1, Plate_4_E10_Sat_EW976030_consensus.1, Plate_4_G06_Sat_EW976181_consensus.1, tag_id_1049.1, tag_id_108.1, tag_id_1184.1, tag_id_1229.1, tag_id_1272.1, tag_id_1366.1, tag_id_1428.1, tag_id_143.1, tag_id_1441.1, tag_id_1449.1, tag_id_1471.1, tag_id_1498.1, tag_id_1558.1, tag_id_1576.1, tag_id_1598.1, tag_id_1604.1, tag_id_1613.1, tag_id_162.1, tag_id_1652.1, tag_id_170.1, tag_id_1708.1, tag_id_1748.1, tag_id_1751.1, tag_id_1762.1, tag_id_179.1, tag_id_1804.1, tag_id_1808.1, tag_id_1810.1, tag_id_1836.1, tag_id_1850.1, tag_id_1880.1, tag_id_1889.1, tag_id_1915.1, tag_id_1950.1, tag_id_1961.1, tag_id_1966.1, tag_id_1982.1, tag_id_1994.1, tag_id_1999.1, tag_id_2008.1, tag_id_2009.1, tag_id_2017.1, tag_id_2062.1, tag_id_2082.1, tag_id_2114.1, tag_id_2134.1, tag_id_2155.1, tag_id_2178.1, tag_id_2182.1, tag_id_220.1, tag_id_2203.1, tag_id_221.1, tag_id_2214.1, tag_id_2237.1, tag_id_2247.1, tag_id_2258.1, tag_id_2301.1, tag_id_2319.1, tag_id_2368.1, tag_id_2499.1, tag_id_250.1, tag_id_2607.1, tag_id_2635.1, tag_id_265.1, tag_id_325.1, tag_id_402.1, tag_id_410.1, tag_id_436.1, tag_id_55.1, tag_id_572.1, tag_id_67.1, tag_id_770.1, tag_id_788.1, tag_id_843.1, tag_id_855.1, tag_id_874.1, tag_id_875.1, tag_id_879.1, tag_id_913.1, tag_id_942.1, tag_id_981.1, tag_id_987.1

54 Reporting Units: aleutianus, alutus, atrovirens, auriculatus, aurora, babcocki, borealis, carnatus, caurinus, chlorostictus, chrysomelas, constellatus, crameri, dallii, diaconus, diploproa, elongatus, emphaeus, ensifer, entomelas, flavidus, goodei, hopkinsi, jordani, levis, maliger, melanops, melanostictus, melanostomus, miniatus, moseri, mystinus, nebulosus, nigrocinctus, oculatus, ovalis, paucispinis, pinniger, polyspinis, proriger, rastrelliger, rosaceus, ruberrimus, rubrivinctus, rufinanus, rufus, saxicola, semicinctus, serranoides, serriceps, umbrosus, zacentrus, reedi, wilsoni

54 Collections: aleutianus, alutus, atrovirens, auriculatus, aurora, babcocki, borealis, carnatus, caurinus, chlorostictus, chrysomelas, constellatus, crameri, dallii, diaconus, diploproa, elongatus, emphaeus, ensifer, entomelas, flavidus, goodei, hopkinsi, jordani, levis, maliger, melanops, melanostictus, melanostomus, miniatus, moseri, mystinus, nebulosus, nigrocinctus, oculatus, ovalis, paucispinis, pinniger, polyspinis, proriger, rastrelliger, rosaceus, ruberrimus, rubrivinctus, rufinanus, rufus, saxicola, semicinctus, serranoides, serriceps, umbrosus, zacentrus, reedi, wilsoni

6.27770534550196% of allelic data identified as missing

What I’m really curious about is whether that cleaned up some of the z-score issues?

# which samples still have z-score issues 
z_bummers <- minus_juvs_selfass %>%
  ungroup() %>%
  filter(scaled_likelihood > 0.95) %>%
  filter(z_score < -3) %>%
  select(indiv, collection, inferred_collection, z_score, scaled_likelihood, n_miss_loci) %>%
  arrange(z_score) 
z_bummers

13 samples with z-scores < -3.

If the average amount of missing data is ~6% (5.5 loci), then the samples with 9, 11, and 13 missing loci are potentially significant, but missing data doesn’t explain the hopkinsi samples.

Although I poked around to figure out what was causing the low z-scores, utimately, I should just remove them. (unless that is too circular, but for the reference baseline, we’ll go ahead because it might be some indication that the samples are not what they should be based on meta data.)

d2 <- dataset %>%
  ungroup() %>%
  anti_join(., z_bummers, by = "indiv")
d2 

Removing samples with z-scores < -3 leaves 1,521 samples.

Try self-assignment again without those

assign2 <- self_assign(d2, gen_start_col = 5)
Summary Statistics:

1521 Individuals in Sample

90 Loci: Plate_1_A01_Sat_GW603857_consensus.1, Plate_1_A11_Sat_GE820299_consensus.1, Plate_2_A09_Sat_EW986980_consensus.1, Plate_2_C08_Sat_EW987116_consensus.1, Plate_2_G06_Sat_EW987118_consensus.1, Plate_3_C03_Sat_GE798118_consensus.1, Plate_4_E10_Sat_EW976030_consensus.1, Plate_4_G06_Sat_EW976181_consensus.1, tag_id_1049.1, tag_id_108.1, tag_id_1184.1, tag_id_1229.1, tag_id_1272.1, tag_id_1366.1, tag_id_1428.1, tag_id_143.1, tag_id_1441.1, tag_id_1449.1, tag_id_1471.1, tag_id_1498.1, tag_id_1558.1, tag_id_1576.1, tag_id_1598.1, tag_id_1604.1, tag_id_1613.1, tag_id_162.1, tag_id_1652.1, tag_id_170.1, tag_id_1708.1, tag_id_1748.1, tag_id_1751.1, tag_id_1762.1, tag_id_179.1, tag_id_1804.1, tag_id_1808.1, tag_id_1810.1, tag_id_1836.1, tag_id_1850.1, tag_id_1880.1, tag_id_1889.1, tag_id_1915.1, tag_id_1950.1, tag_id_1961.1, tag_id_1966.1, tag_id_1982.1, tag_id_1994.1, tag_id_1999.1, tag_id_2008.1, tag_id_2009.1, tag_id_2017.1, tag_id_2062.1, tag_id_2082.1, tag_id_2114.1, tag_id_2134.1, tag_id_2155.1, tag_id_2178.1, tag_id_2182.1, tag_id_220.1, tag_id_2203.1, tag_id_221.1, tag_id_2214.1, tag_id_2237.1, tag_id_2247.1, tag_id_2258.1, tag_id_2301.1, tag_id_2319.1, tag_id_2368.1, tag_id_2499.1, tag_id_250.1, tag_id_2607.1, tag_id_2635.1, tag_id_265.1, tag_id_325.1, tag_id_402.1, tag_id_410.1, tag_id_436.1, tag_id_55.1, tag_id_572.1, tag_id_67.1, tag_id_770.1, tag_id_788.1, tag_id_843.1, tag_id_855.1, tag_id_874.1, tag_id_875.1, tag_id_879.1, tag_id_913.1, tag_id_942.1, tag_id_981.1, tag_id_987.1

54 Reporting Units: aleutianus, alutus, atrovirens, auriculatus, aurora, babcocki, borealis, carnatus, caurinus, chlorostictus, chrysomelas, constellatus, crameri, dallii, diaconus, diploproa, elongatus, emphaeus, ensifer, entomelas, flavidus, goodei, hopkinsi, jordani, levis, maliger, melanops, melanostictus, melanostomus, miniatus, moseri, mystinus, nebulosus, nigrocinctus, oculatus, ovalis, paucispinis, pinniger, polyspinis, proriger, rastrelliger, rosaceus, ruberrimus, rubrivinctus, rufinanus, rufus, saxicola, semicinctus, serranoides, serriceps, umbrosus, zacentrus, reedi, wilsoni

54 Collections: aleutianus, alutus, atrovirens, auriculatus, aurora, babcocki, borealis, carnatus, caurinus, chlorostictus, chrysomelas, constellatus, crameri, dallii, diaconus, diploproa, elongatus, emphaeus, ensifer, entomelas, flavidus, goodei, hopkinsi, jordani, levis, maliger, melanops, melanostictus, melanostomus, miniatus, moseri, mystinus, nebulosus, nigrocinctus, oculatus, ovalis, paucispinis, pinniger, polyspinis, proriger, rastrelliger, rosaceus, ruberrimus, rubrivinctus, rufinanus, rufus, saxicola, semicinctus, serranoides, serriceps, umbrosus, zacentrus, reedi, wilsoni

6.28606910658193% of allelic data identified as missing
Warning message:
In `[<-.data.frame`(`*tmp*`, is_list, value = list(`11` = "<>")) :
  replacement element 1 has 1 row to replace 0 rows

What’s the proportion correctly assigned now?

assign2 %>%
  ungroup() %>%
  filter(scaled_likelihood > 0.95) %>%
  filter(collection == inferred_collection)
1457/1521
[1] 0.9579224

98% assigned correctly at the 50% level 96% assigned correctly at the 99% level

Are all of the misassignments gopher/black-and-yellow?

assign2 %>%
  filter(collection != inferred_collection) %>%
  filter(scaled_likelihood > 0.5)

Yes. All of the misassignments are gopher/black-and-yellow.

Make a single repunit for the gopher/black-and-yellow samples

# change the carnatus reporting unit to chrysomelas
gby_repu <- d2 %>%
  mutate(repunit = ifelse(repunit == "carnatus", "gby", repunit)) %>%
  mutate(repunit = ifelse(repunit == "chrysomelas", "gby", repunit)) %>%
  mutate(collection = ifelse(collection == "carnatus", "gby", repunit)) %>%
  mutate(collection = ifelse(collection == "chrysomelas", "gby", repunit))
# confirm that the repunit is changed but the collection is not.
gby_repu %>%
  filter(collection == "carnatus")

Try self-assignment with that

assign3 <- self_assign(gby_repu, gen_start_col = 5)
Summary Statistics:

1521 Individuals in Sample

90 Loci: Plate_1_A01_Sat_GW603857_consensus.1, Plate_1_A11_Sat_GE820299_consensus.1, Plate_2_A09_Sat_EW986980_consensus.1, Plate_2_C08_Sat_EW987116_consensus.1, Plate_2_G06_Sat_EW987118_consensus.1, Plate_3_C03_Sat_GE798118_consensus.1, Plate_4_E10_Sat_EW976030_consensus.1, Plate_4_G06_Sat_EW976181_consensus.1, tag_id_1049.1, tag_id_108.1, tag_id_1184.1, tag_id_1229.1, tag_id_1272.1, tag_id_1366.1, tag_id_1428.1, tag_id_143.1, tag_id_1441.1, tag_id_1449.1, tag_id_1471.1, tag_id_1498.1, tag_id_1558.1, tag_id_1576.1, tag_id_1598.1, tag_id_1604.1, tag_id_1613.1, tag_id_162.1, tag_id_1652.1, tag_id_170.1, tag_id_1708.1, tag_id_1748.1, tag_id_1751.1, tag_id_1762.1, tag_id_179.1, tag_id_1804.1, tag_id_1808.1, tag_id_1810.1, tag_id_1836.1, tag_id_1850.1, tag_id_1880.1, tag_id_1889.1, tag_id_1915.1, tag_id_1950.1, tag_id_1961.1, tag_id_1966.1, tag_id_1982.1, tag_id_1994.1, tag_id_1999.1, tag_id_2008.1, tag_id_2009.1, tag_id_2017.1, tag_id_2062.1, tag_id_2082.1, tag_id_2114.1, tag_id_2134.1, tag_id_2155.1, tag_id_2178.1, tag_id_2182.1, tag_id_220.1, tag_id_2203.1, tag_id_221.1, tag_id_2214.1, tag_id_2237.1, tag_id_2247.1, tag_id_2258.1, tag_id_2301.1, tag_id_2319.1, tag_id_2368.1, tag_id_2499.1, tag_id_250.1, tag_id_2607.1, tag_id_2635.1, tag_id_265.1, tag_id_325.1, tag_id_402.1, tag_id_410.1, tag_id_436.1, tag_id_55.1, tag_id_572.1, tag_id_67.1, tag_id_770.1, tag_id_788.1, tag_id_843.1, tag_id_855.1, tag_id_874.1, tag_id_875.1, tag_id_879.1, tag_id_913.1, tag_id_942.1, tag_id_981.1, tag_id_987.1

53 Reporting Units: aleutianus, alutus, atrovirens, auriculatus, aurora, babcocki, borealis, gby, caurinus, chlorostictus, constellatus, crameri, dallii, diaconus, diploproa, elongatus, emphaeus, ensifer, entomelas, flavidus, goodei, hopkinsi, jordani, levis, maliger, melanops, melanostictus, melanostomus, miniatus, moseri, mystinus, nebulosus, nigrocinctus, oculatus, ovalis, paucispinis, pinniger, polyspinis, proriger, rastrelliger, rosaceus, ruberrimus, rubrivinctus, rufinanus, rufus, saxicola, semicinctus, serranoides, serriceps, umbrosus, zacentrus, reedi, wilsoni

53 Collections: aleutianus, alutus, atrovirens, auriculatus, aurora, babcocki, borealis, gby, caurinus, chlorostictus, constellatus, crameri, dallii, diaconus, diploproa, elongatus, emphaeus, ensifer, entomelas, flavidus, goodei, hopkinsi, jordani, levis, maliger, melanops, melanostictus, melanostomus, miniatus, moseri, mystinus, nebulosus, nigrocinctus, oculatus, ovalis, paucispinis, pinniger, polyspinis, proriger, rastrelliger, rosaceus, ruberrimus, rubrivinctus, rufinanus, rufus, saxicola, semicinctus, serranoides, serriceps, umbrosus, zacentrus, reedi, wilsoni

6.28606910658193% of allelic data identified as missing

Accurate assignment?

assign3 %>%
  filter(scaled_likelihood > 0.95) %>%
  filter(repunit == inferred_repunit)

100% at the 0.95 likelihood level

Well, either I switch the collection information, in which case, I have 100% assignment, or I move forward with the lower accuracy.

But I think it’s more appropriate to keep the collections intact? Maybe I will describe it both ways in the manuscript:

When carnatus and chrysomelas are individual collections with the ability to assign to a single reporting unit, 96.4% of assignments are accurate at a 95% likelihood threshold.

When carnatus and chrysomelas are considered a single collection (gby), we attain 100% accuracy in assignments at the 95% likelihood threshold.

Downsample

What if I take a maximum of 32 samples per species?

# which species have fewer than 32 samples?
sm_grps <- d2 %>%
  group_by(collection) %>%
  tally() %>%
  arrange(n) %>%
  filter(n < 33)
# make a 2-col dataframe with just those groups
sm_d2 <- d2 %>%
  semi_join(., sm_grps) %>%
  ungroup()
Joining, by = "collection"
# which species have more than 32 samples?
lrg_grps <- d2 %>%
  group_by(collection) %>%
  tally() %>%
  arrange(n) %>%
  filter(n > 32)
  
# downsample those groups
down_sam <- d2 %>%
  semi_join(., lrg_grps) %>%
  group_by(collection) %>%
  sample_n(., 32, replace = FALSE) %>%
  ungroup()
Joining, by = "collection"
# and add the data from the other groups back into the dataframe
down_data <- sm_d2 %>%
  bind_rows(down_sam) #%>%
  # group_by(collection) %>%
  # tally() %>%
  # arrange(desc(n))

Great. that downsampling worked. There are 1,005 samples from 54 species. Now do the self-assignment:

assign_down <- self_assign(down_data, gen_start_col = 5)
Summary Statistics:

1005 Individuals in Sample

90 Loci: Plate_1_A01_Sat_GW603857_consensus.1, Plate_1_A11_Sat_GE820299_consensus.1, Plate_2_A09_Sat_EW986980_consensus.1, Plate_2_C08_Sat_EW987116_consensus.1, Plate_2_G06_Sat_EW987118_consensus.1, Plate_3_C03_Sat_GE798118_consensus.1, Plate_4_E10_Sat_EW976030_consensus.1, Plate_4_G06_Sat_EW976181_consensus.1, tag_id_1049.1, tag_id_108.1, tag_id_1184.1, tag_id_1229.1, tag_id_1272.1, tag_id_1366.1, tag_id_1428.1, tag_id_143.1, tag_id_1441.1, tag_id_1449.1, tag_id_1471.1, tag_id_1498.1, tag_id_1558.1, tag_id_1576.1, tag_id_1598.1, tag_id_1604.1, tag_id_1613.1, tag_id_162.1, tag_id_1652.1, tag_id_170.1, tag_id_1708.1, tag_id_1748.1, tag_id_1751.1, tag_id_1762.1, tag_id_179.1, tag_id_1804.1, tag_id_1808.1, tag_id_1810.1, tag_id_1836.1, tag_id_1850.1, tag_id_1880.1, tag_id_1889.1, tag_id_1915.1, tag_id_1950.1, tag_id_1961.1, tag_id_1966.1, tag_id_1982.1, tag_id_1994.1, tag_id_1999.1, tag_id_2008.1, tag_id_2009.1, tag_id_2017.1, tag_id_2062.1, tag_id_2082.1, tag_id_2114.1, tag_id_2134.1, tag_id_2155.1, tag_id_2178.1, tag_id_2182.1, tag_id_220.1, tag_id_2203.1, tag_id_221.1, tag_id_2214.1, tag_id_2237.1, tag_id_2247.1, tag_id_2258.1, tag_id_2301.1, tag_id_2319.1, tag_id_2368.1, tag_id_2499.1, tag_id_250.1, tag_id_2607.1, tag_id_2635.1, tag_id_265.1, tag_id_325.1, tag_id_402.1, tag_id_410.1, tag_id_436.1, tag_id_55.1, tag_id_572.1, tag_id_67.1, tag_id_770.1, tag_id_788.1, tag_id_843.1, tag_id_855.1, tag_id_874.1, tag_id_875.1, tag_id_879.1, tag_id_913.1, tag_id_942.1, tag_id_981.1, tag_id_987.1

54 Reporting Units: aleutianus, alutus, auriculatus, aurora, babcocki, borealis, caurinus, chlorostictus, constellatus, crameri, dallii, diaconus, diploproa, elongatus, emphaeus, ensifer, entomelas, flavidus, hopkinsi, jordani, maliger, melanops, melanostictus, melanostomus, miniatus, moseri, mystinus, nebulosus, nigrocinctus, oculatus, paucispinis, pinniger, polyspinis, proriger, rastrelliger, rosaceus, ruberrimus, rubrivinctus, rufinanus, rufus, saxicola, semicinctus, serriceps, umbrosus, zacentrus, reedi, wilsoni, atrovirens, carnatus, chrysomelas, goodei, levis, ovalis, serranoides

54 Collections: aleutianus, alutus, auriculatus, aurora, babcocki, borealis, caurinus, chlorostictus, constellatus, crameri, dallii, diaconus, diploproa, elongatus, emphaeus, ensifer, entomelas, flavidus, hopkinsi, jordani, maliger, melanops, melanostictus, melanostomus, miniatus, moseri, mystinus, nebulosus, nigrocinctus, oculatus, paucispinis, pinniger, polyspinis, proriger, rastrelliger, rosaceus, ruberrimus, rubrivinctus, rufinanus, rufus, saxicola, semicinctus, serriceps, umbrosus, zacentrus, reedi, wilsoni, atrovirens, carnatus, chrysomelas, goodei, levis, ovalis, serranoides

8.54063018242123% of allelic data identified as missing

What’s our accuracy?

assign_down %>%
  filter(repunit == inferred_repunit) %>%
  filter(scaled_likelihood > 0.95)
979/1005
[1] 0.9741294

z-scores?

Damn. There are still three samples, all of which are the hopkinsi. I should remove them because (as seen in the PCA) they are clearly wonky somehow (done in 08-pca-w-downsampled-dataset.Rmd)

I think I should move forward with this downsampled dataset because a general reference baseline doesn’t need 200 samples of kelp rockfish and carrying around those genotypes is cumbersome.

Remove those last four samples with wonky z-scores:

down_no_z_data <- down_data %>%
  anti_join(., z_to_remove)
Joining, by = c("repunit", "collection", "indiv")

In this dataset there are 1002 total samples.

Output dataset for figures and other analyses:

dat3 <- down_no_z_data %>%
  ungroup() %>%
  select(-repunit, -sample_type) %>%
  mutate(sample = paste0(collection, indiv)) %>%
  select(183, 1:182)
  # need to reorder the collections to be in phylogenetic order
# set the levels explicitly
dat3$collection <- factor(dat3$collection, levels = c("atrovirens", "chrysomelas", "carnatus", "caurinus", "maliger", "nebulosus", "dallii","rastrelliger", "auriculatus", "saxicola", "semicinctus", "elongatus", "miniatus", "pinniger", "oculatus", "constellatus", "umbrosus", "rosaceus", "chlorostictus", "ensifer", "babcocki", "nigrocinctus", "rubrivinctus", "serriceps", "rufus", "ovalis", "hopkinsi", "rufinanus", "moseri", "jordani", "paucispinis", "goodei", "levis", "entomelas", "mystinus", "diaconus", "flavidus", "serranoides", "melanops", "ruberrimus", "aurora", "diploproa", "melanostomus", "reedi", "crameri", "polyspinis", "alutus", "melanostictus", "aleutianus", "emphaeus", "wilsoni", "zacentrus", "proriger", "borealis"))
ordered_frame <- with(dat3, dat3[order(collection),])
ordered_frame %>%
  select(-collection, -indiv) %>%
  write_csv("csv_outputs/ordered_downsampled_sppID_data.csv")

When we do the self-assignment on this dataset, we get:

assign4 <- self_assign(down_no_z_data, gen_start_col = 5)
Summary Statistics:

1002 Individuals in Sample

90 Loci: Plate_1_A01_Sat_GW603857_consensus.1, Plate_1_A11_Sat_GE820299_consensus.1, Plate_2_A09_Sat_EW986980_consensus.1, Plate_2_C08_Sat_EW987116_consensus.1, Plate_2_G06_Sat_EW987118_consensus.1, Plate_3_C03_Sat_GE798118_consensus.1, Plate_4_E10_Sat_EW976030_consensus.1, Plate_4_G06_Sat_EW976181_consensus.1, tag_id_1049.1, tag_id_108.1, tag_id_1184.1, tag_id_1229.1, tag_id_1272.1, tag_id_1366.1, tag_id_1428.1, tag_id_143.1, tag_id_1441.1, tag_id_1449.1, tag_id_1471.1, tag_id_1498.1, tag_id_1558.1, tag_id_1576.1, tag_id_1598.1, tag_id_1604.1, tag_id_1613.1, tag_id_162.1, tag_id_1652.1, tag_id_170.1, tag_id_1708.1, tag_id_1748.1, tag_id_1751.1, tag_id_1762.1, tag_id_179.1, tag_id_1804.1, tag_id_1808.1, tag_id_1810.1, tag_id_1836.1, tag_id_1850.1, tag_id_1880.1, tag_id_1889.1, tag_id_1915.1, tag_id_1950.1, tag_id_1961.1, tag_id_1966.1, tag_id_1982.1, tag_id_1994.1, tag_id_1999.1, tag_id_2008.1, tag_id_2009.1, tag_id_2017.1, tag_id_2062.1, tag_id_2082.1, tag_id_2114.1, tag_id_2134.1, tag_id_2155.1, tag_id_2178.1, tag_id_2182.1, tag_id_220.1, tag_id_2203.1, tag_id_221.1, tag_id_2214.1, tag_id_2237.1, tag_id_2247.1, tag_id_2258.1, tag_id_2301.1, tag_id_2319.1, tag_id_2368.1, tag_id_2499.1, tag_id_250.1, tag_id_2607.1, tag_id_2635.1, tag_id_265.1, tag_id_325.1, tag_id_402.1, tag_id_410.1, tag_id_436.1, tag_id_55.1, tag_id_572.1, tag_id_67.1, tag_id_770.1, tag_id_788.1, tag_id_843.1, tag_id_855.1, tag_id_874.1, tag_id_875.1, tag_id_879.1, tag_id_913.1, tag_id_942.1, tag_id_981.1, tag_id_987.1

54 Reporting Units: aleutianus, alutus, auriculatus, aurora, babcocki, borealis, caurinus, chlorostictus, constellatus, crameri, dallii, diaconus, diploproa, elongatus, emphaeus, ensifer, entomelas, flavidus, hopkinsi, jordani, maliger, melanops, melanostictus, melanostomus, miniatus, moseri, mystinus, nebulosus, nigrocinctus, oculatus, paucispinis, pinniger, polyspinis, proriger, rastrelliger, rosaceus, ruberrimus, rubrivinctus, rufinanus, rufus, saxicola, semicinctus, serriceps, umbrosus, zacentrus, reedi, wilsoni, atrovirens, carnatus, chrysomelas, goodei, levis, ovalis, serranoides

54 Collections: aleutianus, alutus, auriculatus, aurora, babcocki, borealis, caurinus, chlorostictus, constellatus, crameri, dallii, diaconus, diploproa, elongatus, emphaeus, ensifer, entomelas, flavidus, hopkinsi, jordani, maliger, melanops, melanostictus, melanostomus, miniatus, moseri, mystinus, nebulosus, nigrocinctus, oculatus, paucispinis, pinniger, polyspinis, proriger, rastrelliger, rosaceus, ruberrimus, rubrivinctus, rufinanus, rufus, saxicola, semicinctus, serriceps, umbrosus, zacentrus, reedi, wilsoni, atrovirens, carnatus, chrysomelas, goodei, levis, ovalis, serranoides

8.55511199822577% of allelic data identified as missing

assignment accuracy?

assign4 %>%
  filter(scaled_likelihood > 0.95)
986/1002
[1] 0.9840319

98.4% assigned correctly at the 95% likelihood threshold.

“incorrectly” assigned.

assign4 %>%
  filter(scaled_likelihood > 0.5 & scaled_likelihood < 0.95) %>%
  ungroup()

Summary: In this dataset, there are 1002 samples and 54 species. They are all adults with the exception of 47 juvenile samples included for crameri, wilsoni, and reedi.

I removed a total of 16 samples because of z-score < -3, half of which were hopkinsi, followed by 2 carnatus and 1 each of flavidus, levis, melanops, nigrocinctus, ovalis, and umbrosus.

z_bummers %>%
  bind_rows(z_to_remove) %>%
  group_by(collection) %>%
  tally %>%
  arrange(desc(n))
down_no_z_data %>%
  left_join(., meta, by = c("indiv" = "NMFS_DNA_ID")) %>%
  select(indiv, collection, REPORTED_LIFE_STAGE) %>%
  filter(REPORTED_LIFE_STAGE == "JUVENILE") %>%
  unique()

Hopkinsi investigation

# closer look at hopkinsi
minus_juvs_selfass %>%
  filter(scaled_likelihood > 0.5) %>%
  #filter(z_score < -3) %>%
  #select(indiv, collection, inferred_collection, z_score, scaled_likelihood, n_miss_loci) %>%
  filter(collection == "hopkinsi") %>%
  left_join(., meta, by = c("indiv" = "NMFS_DNA_ID")) %>%
  select(indiv, REPORTED_LIFE_STAGE, COLLECTION_DATE, SAMPLE_COMMENTS)

What if I have sibling groups in my hopkinsi data? Are the “larvae” the hopkinsi samples with low z-scores?

minus_juvs_selfass %>%
  filter(scaled_likelihood > 0.5) %>%
  filter(z_score < -3) %>%
  #select(indiv, collection, inferred_collection, z_score, scaled_likelihood, n_miss_loci) %>%
  filter(collection == "hopkinsi") %>%
  left_join(., meta, by = c("indiv" = "NMFS_DNA_ID")) %>%
  select(indiv, z_score, COLLECTION_DATE, SAMPLE_COMMENTS)

Yes. Not totally sure what to make of this.

Make a list of those samples to investigate this elsewhere:

Here’s another thought:

Take a look at the meta data notes to see if the term “larvae” comes up more than just in the hopkinsi

try2 %>%
  left_join(., meta, by = c("indiv" = "NMFS_DNA_ID")) %>%
  #select(SAMPLE_COMMENTS, REPORTED_LIFE_STAGE, COLLECTION_DATE) %>%
  filter(!is.na(SAMPLE_COMMENTS)) %>%
  filter(SAMPLE_COMMENTS != "Already extracted DNA.") %>%
  filter(SAMPLE_COMMENTS != "Already extracted DNA plate.") 
NA
meta %>%
    filter(!is.na(SAMPLE_COMMENTS)) %>%
  left_join(., try2, by = c("NMFS_DNA_ID" = "indiv")) %>%
  filter(collection == "hopkinsi")
NA

It’s pretty ambiguous whether the samples are from adults (females) who had larvae, or if the samples were larvae themselves and shoud not be included.

For a moment, let’s assume that the samples that say “Larvae” are referring to a female who has larvae.

But if sample R010389 says “Genotype identical to R010388”, then I should make sure I do a matching samples analysis.

Hopkinsi for COLONY

Grab the hopkinsi data for COLONY input

new2col %>%
  filter(collection == "hopkinsi") %>%
  select(-sample_type, -repunit, -collection) %>%
  write_csv("csv_outputs/hopkinsi_genos.csv")

And read in the output (with the caveat that we probably don’t have the power to actually distinguish sibs - low hz)

Based on that, it looks like there is one pair of sibs and one group of four full-sibs.

How do those compare to the hopkinsi samples that had the z-scores?

hopk_sibs <- sibs %>%
  filter(Probability > 0.95) %>%
  filter(ClusterIndex %in% c(2, 3)) %>%
  left_join(., hopkinsi, by = c("OffspringID" = "indiv")) %>%
  select(ClusterIndex, OffspringID, z_score, SAMPLE_COMMENTS) %>%
  select(OffspringID) %>%
  rename(indiv = OffspringID)
LS0tCnRpdGxlOiAianVzdCBhZHVsdHMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCk5vdyB0aGF0IHRoZSBtZXRhIGRhdGEgaXMgb3JnYW5pemVkLCBJIGNhbiBwcmV0dHkgY2xlYXJseSBzZWUgdGhhdCBzb21lIG9mIHRoZSBpc3N1ZXMgYXJlIGNhdXNlZCBieSBqdXZlbmlsZSBzYW1wbGVzLgoKTGV0J3MgcmUtcnVuIHRoZSBhbmFseXNpcyB3aXRoIHRoZW0gcmVtb3ZlZCwgYXMgYSB0ZXN0IGNhc2UuCgpMb2FkIGxpYnJhcmllcyBhbmQgZGF0YQpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocnViaWFzKQoKIyBtZXRhIGRhdGEKbWV0YSA8LSByZWFkUkRTKCIuLi9uZXdfYmFzZWxpbmVfZGF0YS9wcm9jZXNzZWQvbWV0YS1kYXRhLXRpYmJsZS5yZHMiKQoKIyBnZW5vdHlwZSBkYXRhIGluIDItY29sdW1uIGZvcm1hdCBmb3IgcnViaWFzCm5ldzJjb2wgPC0gcmVhZF9jc3YoImNzdl9vdXRwdXRzL25ldzJjb2wuY3N2IikKYGBgCgpIb3cgbWFueSBvZiB0aG9zZSBhcmUganV2ZW5pbGVzPwpgYGB7cn0KanV2aWVzIDwtIG5ldzJjb2wgJT4lCiAgbGVmdF9qb2luKC4sIG1ldGEsIGJ5ID0gYygiaW5kaXYiID0gIk5NRlNfRE5BX0lEIikpICU+JQogIGZpbHRlcihSRVBPUlRFRF9MSUZFX1NUQUdFID09ICJKVVZFTklMRSIpICU+JQogIHNlbGVjdChjb2xsZWN0aW9uLCBpbmRpdikgJT4lCiAgdW5pcXVlKCkKCmp1dl9zYW1wbGVzIDwtIGp1dmllcyAlPiUKICBncm91cF9ieShjb2xsZWN0aW9uKSAlPiUKICB0YWxseSgpICU+JQogIHJlbmFtZShqdXZfc2FtcGxlcyA9IG4pCmBgYApUaGVyZSBhcmUgMTYwIGp1dmVuaWxlIHNhbXBsZXMKCklmIEkgcmVtb3ZlIHNhbXBsZXMgdGhhdCBhcmUganV2ZW5pbGVzLCB3aGF0IGFyZSBteSBudW1iZXJzIHBlciBzcGVjaWVzPwpgYGB7cn0KbmV3MmNvbCAlPiUKICBzZW1pX2pvaW4oLiwgbWV0YSwgYnkgPSBjKCJpbmRpdiIgPSAiTk1GU19ETkFfSUQiKSkgJT4lCiAgI2FudGlfam9pbiguLCBqdXZpZXMsIGJ5ID0gImluZGl2IikgJT4lCiAgZ3JvdXBfYnkoY29sbGVjdGlvbikgJT4lCiAgdGFsbHkoKSAlPiUKICByZW5hbWUodG90YWxfc2FtcGxlcyA9IG4pICU+JQogIGxlZnRfam9pbiguLCBqdXZfc2FtcGxlcywgYnkgPSAiY29sbGVjdGlvbiIpICU+JQogIG11dGF0ZShyZW1haW5pbmdfc2FtcGxlcyA9IHRvdGFsX3NhbXBsZXMtanV2X3NhbXBsZXMpICU+JQogIGFycmFuZ2UocmVtYWluaW5nX3NhbXBsZXMpCgpgYGAKV2UgbG9zZSByZWVkaSBhbmQgd2lsc29uaSB3aGVuIHdlIGV4Y2x1ZGUganV2ZW5pbGVzLCBhbmQgZHJvcCBkb3duIHRvIGp1c3QgMiBzYW1wbGVzIG9mIGNyYW1lcmkgYW5kIGZpdmUgb2Ygc2VycmljZXBzLgoKSG93ZXZlciwgZ2VuZXJhbGx5IGluY2x1ZGluZyBqdXZlbmlsZXMgaXMgYSBiYWQgaWRlYS4gU28gaGVyZSdzIHdoYXQgSSdsbCBkbzogRm9yIGFueSBzcGVjaWVzIGZvciB3aGljaCB3ZSBlbmQgdXAgd2l0aCBmZXdlciB0aGFuIDUgc2FtcGxlcywgSSB3aWxsIGluY2x1ZGUganV2ZW5pbGVzIHVwIHRvIHRoYXQgbnVtYmVyLgoKYGBge3J9CiMganVzdCBqdXZlbmlsZSBzYW1wbGVzIGZvciB0aGVzZSB0aHJlZSBzcGVjaWVzCmp1dnNfdG9fa2VlcCA8LSBuZXcyY29sICU+JQogIHVuZ3JvdXAoKSAlPiUKICBmaWx0ZXIoY29sbGVjdGlvbiAlaW4lIGMoInJlZWRpIiwgIndpbHNvbmkiLCAiY3JhbWVyaSIpKSAlPiUKICBsZWZ0X2pvaW4oLiwgbWV0YSwgYnkgPSBjKCJpbmRpdiIgPSAiTk1GU19ETkFfSUQiKSkgJT4lCiAgZ3JvdXBfYnkoY29sbGVjdGlvbikgJT4lCiAgZmlsdGVyKFJFUE9SVEVEX0xJRkVfU1RBR0UgPT0gIkpVVkVOSUxFIikgJT4lCiAgc2VsZWN0KDE6MTg0KQoKYGBgCgpOb3cgdGhhdCBJIGhhdmUgdGhvc2Ugc2FtcGxlcyBzZWxlY3RlZCwgSSBjYW4gcmVtb3ZlIGFsbCBqdXZlbmlsZSBzYW1wbGVzIGFuZCBwdXQgYmFjayB0aG9zZSBmcm9tIHRoZSBganV2c190b19rZWVwYApgYGB7cn0KZGF0YXNldCA8LSBuZXcyY29sICU+JQogIHVuZ3JvdXAoKSAlPiUKICBhbnRpX2pvaW4oanV2aWVzKSAlPiUKICBiaW5kX3Jvd3MoanV2c190b19rZWVwKQoKZGF0YXNldCAlPiUKICBncm91cF9ieShyZXB1bml0KSAlPiUKICB0YWxseSgpICU+JQogIGFycmFuZ2UobikgJT4lCiAgd3JpdGVfY3N2KCJjc3Zfb3V0cHV0cy9kYXRhc2V0X3NwcF93b19qdXZzLmNzdiIpCiAgCmBgYAoKS2VlcGluZyBqdXN0IHRoZSBqdXZlbmlsZXMgZnJvbSB0aG9zZSB0aHJlZSBzcGVjaWVzLCB3ZSBoYXZlIGEgdG90YWwgb2YgMSw1MzQgc2FtcGxlcyBmcm9tIDU0IHNwZWNpZXMuCgoKTGV0J3MgdHJ5IG91dCB0aGUgc2VsZi1hc3NpZ25tZW50IHdpdGggdGhhdCBkYXRhc2V0OgpgYGB7cn0KbWludXNfanV2c19zZWxmYXNzIDwtIHNlbGZfYXNzaWduKGRhdGFzZXQsIGdlbl9zdGFydF9jb2wgPSA1KQoKYGBgCgpXaGF0IEknbSByZWFsbHkgY3VyaW91cyBhYm91dCBpcyB3aGV0aGVyIHRoYXQgY2xlYW5lZCB1cCBzb21lIG9mIHRoZSB6LXNjb3JlIGlzc3Vlcz8KYGBge3J9CiMgd2hpY2ggc2FtcGxlcyBzdGlsbCBoYXZlIHotc2NvcmUgaXNzdWVzIAp6X2J1bW1lcnMgPC0gbWludXNfanV2c19zZWxmYXNzICU+JQogIHVuZ3JvdXAoKSAlPiUKICBmaWx0ZXIoc2NhbGVkX2xpa2VsaWhvb2QgPiAwLjk1KSAlPiUKICBmaWx0ZXIoel9zY29yZSA8IC0zKSAlPiUKICBzZWxlY3QoaW5kaXYsIGNvbGxlY3Rpb24sIGluZmVycmVkX2NvbGxlY3Rpb24sIHpfc2NvcmUsIHNjYWxlZF9saWtlbGlob29kLCBuX21pc3NfbG9jaSkgJT4lCiAgYXJyYW5nZSh6X3Njb3JlKSAKCnpfYnVtbWVycwpgYGAKMTMgc2FtcGxlcyB3aXRoIHotc2NvcmVzIDwgLTMuCgpJZiB0aGUgYXZlcmFnZSBhbW91bnQgb2YgbWlzc2luZyBkYXRhIGlzIH42JSAoNS41IGxvY2kpLCB0aGVuIHRoZSBzYW1wbGVzIHdpdGggOSwgMTEsIGFuZCAxMyBtaXNzaW5nIGxvY2kgYXJlIHBvdGVudGlhbGx5IHNpZ25pZmljYW50LCBidXQgbWlzc2luZyBkYXRhIGRvZXNuJ3QgZXhwbGFpbiB0aGUgaG9wa2luc2kgc2FtcGxlcy4KCkFsdGhvdWdoIEkgcG9rZWQgYXJvdW5kIHRvIGZpZ3VyZSBvdXQgd2hhdCB3YXMgY2F1c2luZyB0aGUgbG93IHotc2NvcmVzLCB1dGltYXRlbHksIEkgc2hvdWxkIGp1c3QgcmVtb3ZlIHRoZW0uICh1bmxlc3MgdGhhdCBpcyB0b28gY2lyY3VsYXIsIGJ1dCBmb3IgdGhlIHJlZmVyZW5jZSBiYXNlbGluZSwgd2UnbGwgZ28gYWhlYWQgYmVjYXVzZSBpdCBtaWdodCBiZSBzb21lIGluZGljYXRpb24gdGhhdCB0aGUgc2FtcGxlcyBhcmUgbm90IHdoYXQgdGhleSBzaG91bGQgYmUgYmFzZWQgb24gbWV0YSBkYXRhLikKYGBge3J9CmQyIDwtIGRhdGFzZXQgJT4lCiAgdW5ncm91cCgpICU+JQogIGFudGlfam9pbiguLCB6X2J1bW1lcnMsIGJ5ID0gImluZGl2IikKCmQyIApgYGAKUmVtb3Zpbmcgc2FtcGxlcyB3aXRoIHotc2NvcmVzIDwgLTMgbGVhdmVzIDEsNTIxIHNhbXBsZXMuCgpUcnkgc2VsZi1hc3NpZ25tZW50IGFnYWluIHdpdGhvdXQgdGhvc2UgCmBgYHtyfQphc3NpZ24yIDwtIHNlbGZfYXNzaWduKGQyLCBnZW5fc3RhcnRfY29sID0gNSkKYGBgCgpXaGF0J3MgdGhlIHByb3BvcnRpb24gY29ycmVjdGx5IGFzc2lnbmVkIG5vdz8KYGBge3J9CmFzc2lnbjIgJT4lCiAgdW5ncm91cCgpICU+JQogIGZpbHRlcihzY2FsZWRfbGlrZWxpaG9vZCA+IDAuOTUpICU+JQogIGZpbHRlcihjb2xsZWN0aW9uID09IGluZmVycmVkX2NvbGxlY3Rpb24pCmBgYAoKYGBge3J9CjE0NTcvMTUyMQpgYGAKOTglIGFzc2lnbmVkIGNvcnJlY3RseSBhdCB0aGUgNTAlIGxldmVsCjk2JSBhc3NpZ25lZCBjb3JyZWN0bHkgYXQgdGhlIDk5JSBsZXZlbAoKQXJlIGFsbCBvZiB0aGUgbWlzYXNzaWdubWVudHMgZ29waGVyL2JsYWNrLWFuZC15ZWxsb3c/CgpgYGB7cn0KYXNzaWduMiAlPiUKICBmaWx0ZXIoY29sbGVjdGlvbiAhPSBpbmZlcnJlZF9jb2xsZWN0aW9uKSAlPiUKICBmaWx0ZXIoc2NhbGVkX2xpa2VsaWhvb2QgPiAwLjUpCmBgYApZZXMuIEFsbCBvZiB0aGUgbWlzYXNzaWdubWVudHMgYXJlIGdvcGhlci9ibGFjay1hbmQteWVsbG93LgoKIyMgTWFrZSBhIHNpbmdsZSByZXB1bml0IGZvciB0aGUgZ29waGVyL2JsYWNrLWFuZC15ZWxsb3cgc2FtcGxlcwoKYGBge3J9CiMgY2hhbmdlIHRoZSBjYXJuYXR1cyByZXBvcnRpbmcgdW5pdCB0byBjaHJ5c29tZWxhcwpnYnlfcmVwdSA8LSBkMiAlPiUKICBtdXRhdGUocmVwdW5pdCA9IGlmZWxzZShyZXB1bml0ID09ICJjYXJuYXR1cyIsICJnYnkiLCByZXB1bml0KSkgJT4lCiAgbXV0YXRlKHJlcHVuaXQgPSBpZmVsc2UocmVwdW5pdCA9PSAiY2hyeXNvbWVsYXMiLCAiZ2J5IiwgcmVwdW5pdCkpICU+JQogIG11dGF0ZShjb2xsZWN0aW9uID0gaWZlbHNlKGNvbGxlY3Rpb24gPT0gImNhcm5hdHVzIiwgImdieSIsIHJlcHVuaXQpKSAlPiUKICBtdXRhdGUoY29sbGVjdGlvbiA9IGlmZWxzZShjb2xsZWN0aW9uID09ICJjaHJ5c29tZWxhcyIsICJnYnkiLCByZXB1bml0KSkKCiMgY29uZmlybSB0aGF0IHRoZSByZXB1bml0IGlzIGNoYW5nZWQgYnV0IHRoZSBjb2xsZWN0aW9uIGlzIG5vdC4KZ2J5X3JlcHUgJT4lCiAgZmlsdGVyKGNvbGxlY3Rpb24gPT0gImNhcm5hdHVzIikKYGBgCgpUcnkgc2VsZi1hc3NpZ25tZW50IHdpdGggdGhhdApgYGB7cn0KYXNzaWduMyA8LSBzZWxmX2Fzc2lnbihnYnlfcmVwdSwgZ2VuX3N0YXJ0X2NvbCA9IDUpCmBgYAoKQWNjdXJhdGUgYXNzaWdubWVudD8KYGBge3J9CmFzc2lnbjMgJT4lCiAgZmlsdGVyKHNjYWxlZF9saWtlbGlob29kID4gMC45NSkgJT4lCiAgZmlsdGVyKHJlcHVuaXQgPT0gaW5mZXJyZWRfcmVwdW5pdCkKYGBgCjEwMCUgYXQgdGhlIDAuOTUgbGlrZWxpaG9vZCBsZXZlbAoKCldlbGwsIGVpdGhlciBJIHN3aXRjaCB0aGUgY29sbGVjdGlvbiBpbmZvcm1hdGlvbiwgaW4gd2hpY2ggY2FzZSwgSSBoYXZlIDEwMCUgYXNzaWdubWVudCwgb3IgSSBtb3ZlIGZvcndhcmQgd2l0aCB0aGUgbG93ZXIgYWNjdXJhY3kuCgpCdXQgSSB0aGluayBpdCdzIG1vcmUgYXBwcm9wcmlhdGUgdG8ga2VlcCB0aGUgY29sbGVjdGlvbnMgaW50YWN0PwpNYXliZSBJIHdpbGwgZGVzY3JpYmUgaXQgYm90aCB3YXlzIGluIHRoZSBtYW51c2NyaXB0OgoKV2hlbiBjYXJuYXR1cyBhbmQgY2hyeXNvbWVsYXMgYXJlIGluZGl2aWR1YWwgY29sbGVjdGlvbnMgd2l0aCB0aGUgYWJpbGl0eSB0byBhc3NpZ24gdG8gYSBzaW5nbGUgcmVwb3J0aW5nIHVuaXQsIDk2LjQlIG9mIGFzc2lnbm1lbnRzIGFyZSBhY2N1cmF0ZSBhdCBhIDk1JSBsaWtlbGlob29kIHRocmVzaG9sZC4gCgpXaGVuIGNhcm5hdHVzIGFuZCBjaHJ5c29tZWxhcyBhcmUgY29uc2lkZXJlZCBhIHNpbmdsZSBjb2xsZWN0aW9uIChnYnkpLCB3ZSBhdHRhaW4gMTAwJSBhY2N1cmFjeSBpbiBhc3NpZ25tZW50cyBhdCB0aGUgOTUlIGxpa2VsaWhvb2QgdGhyZXNob2xkLgoKIyMgRG93bnNhbXBsZQoKV2hhdCBpZiBJIHRha2UgYSBtYXhpbXVtIG9mIDMyIHNhbXBsZXMgcGVyIHNwZWNpZXM/CgpgYGB7ciBkb3duc2FtcGxlfQojIHdoaWNoIHNwZWNpZXMgaGF2ZSBmZXdlciB0aGFuIDMyIHNhbXBsZXM/CnNtX2dycHMgPC0gZDIgJT4lCiAgZ3JvdXBfYnkoY29sbGVjdGlvbikgJT4lCiAgdGFsbHkoKSAlPiUKICBhcnJhbmdlKG4pICU+JQogIGZpbHRlcihuIDwgMzMpCgojIG1ha2UgYSAyLWNvbCBkYXRhZnJhbWUgd2l0aCBqdXN0IHRob3NlIGdyb3VwcwpzbV9kMiA8LSBkMiAlPiUKICBzZW1pX2pvaW4oLiwgc21fZ3JwcykgJT4lCiAgdW5ncm91cCgpCgojIHdoaWNoIHNwZWNpZXMgaGF2ZSBtb3JlIHRoYW4gMzIgc2FtcGxlcz8KbHJnX2dycHMgPC0gZDIgJT4lCiAgZ3JvdXBfYnkoY29sbGVjdGlvbikgJT4lCiAgdGFsbHkoKSAlPiUKICBhcnJhbmdlKG4pICU+JQogIGZpbHRlcihuID4gMzIpCiAgCiMgZG93bnNhbXBsZSB0aG9zZSBncm91cHMKZG93bl9zYW0gPC0gZDIgJT4lCiAgc2VtaV9qb2luKC4sIGxyZ19ncnBzKSAlPiUKICBncm91cF9ieShjb2xsZWN0aW9uKSAlPiUKICBzYW1wbGVfbiguLCAzMiwgcmVwbGFjZSA9IEZBTFNFKSAlPiUKICB1bmdyb3VwKCkKCiMgYW5kIGFkZCB0aGUgZGF0YSBmcm9tIHRoZSBvdGhlciBncm91cHMgYmFjayBpbnRvIHRoZSBkYXRhZnJhbWUKZG93bl9kYXRhIDwtIHNtX2QyICU+JQogIGJpbmRfcm93cyhkb3duX3NhbSkgIyU+JQogICMgZ3JvdXBfYnkoY29sbGVjdGlvbikgJT4lCiAgIyB0YWxseSgpICU+JQogICMgYXJyYW5nZShkZXNjKG4pKQoKYGBgCgpHcmVhdC4gdGhhdCBkb3duc2FtcGxpbmcgd29ya2VkLiBUaGVyZSBhcmUgMSwwMDUgc2FtcGxlcyBmcm9tIDU0IHNwZWNpZXMuCk5vdyBkbyB0aGUgc2VsZi1hc3NpZ25tZW50OgpgYGB7cn0KYXNzaWduX2Rvd24gPC0gc2VsZl9hc3NpZ24oZG93bl9kYXRhLCBnZW5fc3RhcnRfY29sID0gNSkKYGBgCgpXaGF0J3Mgb3VyIGFjY3VyYWN5PwpgYGB7cn0KYXNzaWduX2Rvd24gJT4lCiAgZmlsdGVyKHJlcHVuaXQgPT0gaW5mZXJyZWRfcmVwdW5pdCkgJT4lCiAgZmlsdGVyKHNjYWxlZF9saWtlbGlob29kID4gMC45NSkKYGBgCgpgYGB7cn0KOTc5LzEwMDUKYGBgCgoKei1zY29yZXM/CmBgYHtyfQp6X3RvX3JlbW92ZSA8LSBhc3NpZ25fZG93biAlPiUKICBmaWx0ZXIoc2NhbGVkX2xpa2VsaWhvb2QgPiAwLjUpICU+JQogIGZpbHRlcih6X3Njb3JlIDwgLTMpCmBgYAoKRGFtbi4gVGhlcmUgYXJlIHN0aWxsIHRocmVlIHNhbXBsZXMsIGFsbCBvZiB3aGljaCBhcmUgdGhlIGhvcGtpbnNpLiBJIHNob3VsZCByZW1vdmUgdGhlbSBiZWNhdXNlIChhcyBzZWVuIGluIHRoZSBQQ0EpIHRoZXkgYXJlIGNsZWFybHkgd29ua3kgc29tZWhvdyAoZG9uZSBpbiBgMDgtcGNhLXctZG93bnNhbXBsZWQtZGF0YXNldC5SbWRgKQoKSSB0aGluayBJIHNob3VsZCBtb3ZlIGZvcndhcmQgd2l0aCB0aGlzIGRvd25zYW1wbGVkIGRhdGFzZXQgYmVjYXVzZSBhIGdlbmVyYWwgcmVmZXJlbmNlIGJhc2VsaW5lIGRvZXNuJ3QgbmVlZCAyMDAgc2FtcGxlcyBvZiBrZWxwIHJvY2tmaXNoIGFuZCBjYXJyeWluZyBhcm91bmQgdGhvc2UgZ2Vub3R5cGVzIGlzIGN1bWJlcnNvbWUuIAoKUmVtb3ZlIHRob3NlIGxhc3QgZm91ciBzYW1wbGVzIHdpdGggd29ua3kgei1zY29yZXM6CmBgYHtyfQpkb3duX25vX3pfZGF0YSA8LSBkb3duX2RhdGEgJT4lCiAgYW50aV9qb2luKC4sIHpfdG9fcmVtb3ZlKQpgYGAKSW4gdGhpcyBkYXRhc2V0IHRoZXJlIGFyZSAxMDAyIHRvdGFsIHNhbXBsZXMuCgpPdXRwdXQgZGF0YXNldCBmb3IgZmlndXJlcyBhbmQgb3RoZXIgYW5hbHlzZXM6CmBgYHtyIG91dHB1dHN9CmRhdDMgPC0gZG93bl9ub196X2RhdGEgJT4lCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdCgtcmVwdW5pdCwgLXNhbXBsZV90eXBlKSAlPiUKICBtdXRhdGUoc2FtcGxlID0gcGFzdGUwKGNvbGxlY3Rpb24sIGluZGl2KSkgJT4lCiAgc2VsZWN0KDE4MywgMToxODIpCiAgIyBuZWVkIHRvIHJlb3JkZXIgdGhlIGNvbGxlY3Rpb25zIHRvIGJlIGluIHBoeWxvZ2VuZXRpYyBvcmRlcgpgYGAKCmBgYHtyfQojIHNldCB0aGUgbGV2ZWxzIGV4cGxpY2l0bHkKZGF0MyRjb2xsZWN0aW9uIDwtIGZhY3RvcihkYXQzJGNvbGxlY3Rpb24sIGxldmVscyA9IGMoImF0cm92aXJlbnMiLCAiY2hyeXNvbWVsYXMiLCAiY2FybmF0dXMiLCAiY2F1cmludXMiLCAibWFsaWdlciIsICJuZWJ1bG9zdXMiLCAiZGFsbGlpIiwicmFzdHJlbGxpZ2VyIiwgImF1cmljdWxhdHVzIiwgInNheGljb2xhIiwgInNlbWljaW5jdHVzIiwgImVsb25nYXR1cyIsICJtaW5pYXR1cyIsICJwaW5uaWdlciIsICJvY3VsYXR1cyIsICJjb25zdGVsbGF0dXMiLCAidW1icm9zdXMiLCAicm9zYWNldXMiLCAiY2hsb3Jvc3RpY3R1cyIsICJlbnNpZmVyIiwgImJhYmNvY2tpIiwgIm5pZ3JvY2luY3R1cyIsICJydWJyaXZpbmN0dXMiLCAic2VycmljZXBzIiwgInJ1ZnVzIiwgIm92YWxpcyIsICJob3BraW5zaSIsICJydWZpbmFudXMiLCAibW9zZXJpIiwgImpvcmRhbmkiLCAicGF1Y2lzcGluaXMiLCAiZ29vZGVpIiwgImxldmlzIiwgImVudG9tZWxhcyIsICJteXN0aW51cyIsICJkaWFjb251cyIsICJmbGF2aWR1cyIsICJzZXJyYW5vaWRlcyIsICJtZWxhbm9wcyIsICJydWJlcnJpbXVzIiwgImF1cm9yYSIsICJkaXBsb3Byb2EiLCAibWVsYW5vc3RvbXVzIiwgInJlZWRpIiwgImNyYW1lcmkiLCAicG9seXNwaW5pcyIsICJhbHV0dXMiLCAibWVsYW5vc3RpY3R1cyIsICJhbGV1dGlhbnVzIiwgImVtcGhhZXVzIiwgIndpbHNvbmkiLCAiemFjZW50cnVzIiwgInByb3JpZ2VyIiwgImJvcmVhbGlzIikpCgpvcmRlcmVkX2ZyYW1lIDwtIHdpdGgoZGF0MywgZGF0M1tvcmRlcihjb2xsZWN0aW9uKSxdKQoKb3JkZXJlZF9mcmFtZSAlPiUKICBzZWxlY3QoLWNvbGxlY3Rpb24sIC1pbmRpdikgJT4lCiAgd3JpdGVfY3N2KCJjc3Zfb3V0cHV0cy9vcmRlcmVkX2Rvd25zYW1wbGVkX3NwcElEX2RhdGEuY3N2IikKYGBgCgoKV2hlbiB3ZSBkbyB0aGUgc2VsZi1hc3NpZ25tZW50IG9uIHRoaXMgZGF0YXNldCwgd2UgZ2V0OgpgYGB7cn0KYXNzaWduNCA8LSBzZWxmX2Fzc2lnbihkb3duX25vX3pfZGF0YSwgZ2VuX3N0YXJ0X2NvbCA9IDUpCmBgYAoKYXNzaWdubWVudCBhY2N1cmFjeT8KYGBge3J9CmFzc2lnbjQgJT4lCiAgZmlsdGVyKHNjYWxlZF9saWtlbGlob29kID4gMC45NSkKYGBgCmBgYHtyfQo5ODYvMTAwMgpgYGAKOTguNCUgYXNzaWduZWQgY29ycmVjdGx5IGF0IHRoZSA5NSUgbGlrZWxpaG9vZCB0aHJlc2hvbGQuCgoiaW5jb3JyZWN0bHkiIGFzc2lnbmVkLgpgYGB7cn0KYXNzaWduNCAlPiUKICBmaWx0ZXIoc2NhbGVkX2xpa2VsaWhvb2QgPiAwLjUgJiBzY2FsZWRfbGlrZWxpaG9vZCA8IDAuOTUpICU+JQogIHVuZ3JvdXAoKQpgYGAKClN1bW1hcnk6CkluIHRoaXMgZGF0YXNldCwgdGhlcmUgYXJlIDEwMDIgc2FtcGxlcyBhbmQgNTQgc3BlY2llcy4gVGhleSBhcmUgYWxsIGFkdWx0cyB3aXRoIHRoZSBleGNlcHRpb24gb2YgNDcganV2ZW5pbGUgc2FtcGxlcyBpbmNsdWRlZCBmb3IgY3JhbWVyaSwgd2lsc29uaSwgYW5kIHJlZWRpLgoKSSByZW1vdmVkIGEgdG90YWwgb2YgMTYgc2FtcGxlcyBiZWNhdXNlIG9mIHotc2NvcmUgPCAtMywgaGFsZiBvZiB3aGljaCB3ZXJlIGhvcGtpbnNpLCBmb2xsb3dlZCBieSAyIGNhcm5hdHVzIGFuZCAxIGVhY2ggb2YgZmxhdmlkdXMsIGxldmlzLCBtZWxhbm9wcywgbmlncm9jaW5jdHVzLCBvdmFsaXMsIGFuZCB1bWJyb3N1cy4KYGBge3Igei1zYW1wbGUtc3VtbWFyeX0Kel9idW1tZXJzICU+JQogIGJpbmRfcm93cyh6X3RvX3JlbW92ZSkgJT4lCiAgZ3JvdXBfYnkoY29sbGVjdGlvbikgJT4lCiAgdGFsbHkgJT4lCiAgYXJyYW5nZShkZXNjKG4pKQpgYGAKCgpgYGB7ciBqdXZzLWtlcHQtc3VtbWFyeX0KZG93bl9ub196X2RhdGEgJT4lCiAgbGVmdF9qb2luKC4sIG1ldGEsIGJ5ID0gYygiaW5kaXYiID0gIk5NRlNfRE5BX0lEIikpICU+JQogIHNlbGVjdChpbmRpdiwgY29sbGVjdGlvbiwgUkVQT1JURURfTElGRV9TVEFHRSkgJT4lCiAgZmlsdGVyKFJFUE9SVEVEX0xJRkVfU1RBR0UgPT0gIkpVVkVOSUxFIikgJT4lCiAgdW5pcXVlKCkKYGBgCgoKCgoKIyMgSG9wa2luc2kgaW52ZXN0aWdhdGlvbgoKYGBge3J9CiMgY2xvc2VyIGxvb2sgYXQgaG9wa2luc2kKbWludXNfanV2c19zZWxmYXNzICU+JQogIGZpbHRlcihzY2FsZWRfbGlrZWxpaG9vZCA+IDAuNSkgJT4lCiAgI2ZpbHRlcih6X3Njb3JlIDwgLTMpICU+JQogICNzZWxlY3QoaW5kaXYsIGNvbGxlY3Rpb24sIGluZmVycmVkX2NvbGxlY3Rpb24sIHpfc2NvcmUsIHNjYWxlZF9saWtlbGlob29kLCBuX21pc3NfbG9jaSkgJT4lCiAgZmlsdGVyKGNvbGxlY3Rpb24gPT0gImhvcGtpbnNpIikgJT4lCiAgbGVmdF9qb2luKC4sIG1ldGEsIGJ5ID0gYygiaW5kaXYiID0gIk5NRlNfRE5BX0lEIikpICU+JQogIHNlbGVjdChpbmRpdiwgUkVQT1JURURfTElGRV9TVEFHRSwgQ09MTEVDVElPTl9EQVRFLCBTQU1QTEVfQ09NTUVOVFMpCmBgYAoKV2hhdCBpZiBJIGhhdmUgc2libGluZyBncm91cHMgaW4gbXkgaG9wa2luc2kgZGF0YT8KQXJlIHRoZSAibGFydmFlIiB0aGUgaG9wa2luc2kgc2FtcGxlcyB3aXRoIGxvdyB6LXNjb3Jlcz8KYGBge3J9Cm1pbnVzX2p1dnNfc2VsZmFzcyAlPiUKICBmaWx0ZXIoc2NhbGVkX2xpa2VsaWhvb2QgPiAwLjUpICU+JQogIGZpbHRlcih6X3Njb3JlIDwgLTMpICU+JQogICNzZWxlY3QoaW5kaXYsIGNvbGxlY3Rpb24sIGluZmVycmVkX2NvbGxlY3Rpb24sIHpfc2NvcmUsIHNjYWxlZF9saWtlbGlob29kLCBuX21pc3NfbG9jaSkgJT4lCiAgZmlsdGVyKGNvbGxlY3Rpb24gPT0gImhvcGtpbnNpIikgJT4lCiAgbGVmdF9qb2luKC4sIG1ldGEsIGJ5ID0gYygiaW5kaXYiID0gIk5NRlNfRE5BX0lEIikpICU+JQogIHNlbGVjdChpbmRpdiwgel9zY29yZSwgQ09MTEVDVElPTl9EQVRFLCBTQU1QTEVfQ09NTUVOVFMpCmBgYApZZXMuIE5vdCB0b3RhbGx5IHN1cmUgd2hhdCB0byBtYWtlIG9mIHRoaXMuCgpNYWtlIGEgbGlzdCBvZiB0aG9zZSBzYW1wbGVzIHRvIGludmVzdGlnYXRlIHRoaXMgZWxzZXdoZXJlOgpgYGB7cn0KIyBjbG9zZXIgbG9vayBhdCBob3BraW5zaQpob3BraW5zaSA8LSBtaW51c19qdXZzX3NlbGZhc3MgJT4lCiAgZmlsdGVyKHNjYWxlZF9saWtlbGlob29kID4gMC41KSAlPiUKICAjZmlsdGVyKHpfc2NvcmUgPCAtMykgJT4lCiAgI3NlbGVjdChpbmRpdiwgY29sbGVjdGlvbiwgaW5mZXJyZWRfY29sbGVjdGlvbiwgel9zY29yZSwgc2NhbGVkX2xpa2VsaWhvb2QsIG5fbWlzc19sb2NpKSAlPiUKICBmaWx0ZXIoY29sbGVjdGlvbiA9PSAiaG9wa2luc2kiKSAlPiUKICBsZWZ0X2pvaW4oLiwgbWV0YSwgYnkgPSBjKCJpbmRpdiIgPSAiTk1GU19ETkFfSUQiKSkgIyU+JQogICMgc2VsZWN0KGluZGl2KSAlPiUKICAjIHJlbmFtZShOTUZTX0ROQV9JRCA9IGluZGl2KQoKI3dyaXRlX2Nzdihob3BraW5zaSwgImNzdl9vdXRwdXRzL2hvcGtpbnNpX3NhbXBsZXMuY3N2IikKCmBgYAoKIyMgSGVyZSdzIGFub3RoZXIgdGhvdWdodDoKVGFrZSBhIGxvb2sgYXQgdGhlIG1ldGEgZGF0YSBub3RlcyB0byBzZWUgaWYgdGhlIHRlcm0gImxhcnZhZSIgY29tZXMgdXAgbW9yZSB0aGFuIGp1c3QgaW4gdGhlIGhvcGtpbnNpCgpgYGB7cn0KdHJ5MiAlPiUKICBsZWZ0X2pvaW4oLiwgbWV0YSwgYnkgPSBjKCJpbmRpdiIgPSAiTk1GU19ETkFfSUQiKSkgJT4lCiAgc2VsZWN0KFNBTVBMRV9DT01NRU5UUywgUkVQT1JURURfTElGRV9TVEFHRSwgQ09MTEVDVElPTl9EQVRFKSAlPiUKICBmaWx0ZXIoIWlzLm5hKFNBTVBMRV9DT01NRU5UUykpICU+JQogIGZpbHRlcihTQU1QTEVfQ09NTUVOVFMgIT0gIkFscmVhZHkgZXh0cmFjdGVkIEROQS4iKSAlPiUKICBmaWx0ZXIoU0FNUExFX0NPTU1FTlRTICE9ICJBbHJlYWR5IGV4dHJhY3RlZCBETkEgcGxhdGUuIikgCiAgCmBgYAoKYGBge3J9Cm1ldGEgJT4lCiAgICBmaWx0ZXIoIWlzLm5hKFNBTVBMRV9DT01NRU5UUykpICU+JQogIGxlZnRfam9pbiguLCB0cnkyLCBieSA9IGMoIk5NRlNfRE5BX0lEIiA9ICJpbmRpdiIpKSAlPiUKICBmaWx0ZXIoY29sbGVjdGlvbiA9PSAiaG9wa2luc2kiKQogIApgYGAKCkl0J3MgcHJldHR5IGFtYmlndW91cyB3aGV0aGVyIHRoZSBzYW1wbGVzIGFyZSBmcm9tIGFkdWx0cyAoZmVtYWxlcykgd2hvIGhhZCBsYXJ2YWUsIG9yIGlmIHRoZSBzYW1wbGVzIHdlcmUgbGFydmFlIHRoZW1zZWx2ZXMgYW5kIHNob3VkIG5vdCBiZSBpbmNsdWRlZC4gCgpGb3IgYSBtb21lbnQsIGxldCdzIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGVzIHRoYXQgc2F5ICJMYXJ2YWUiIGFyZSByZWZlcnJpbmcgdG8gYSBmZW1hbGUgd2hvIGhhcyBsYXJ2YWUuCgpCdXQgaWYgc2FtcGxlIGBSMDEwMzg5YCBzYXlzICJHZW5vdHlwZSBpZGVudGljYWwgdG8gUjAxMDM4OCIsIHRoZW4gSSBzaG91bGQgbWFrZSBzdXJlIEkgZG8gYSBtYXRjaGluZyBzYW1wbGVzIGFuYWx5c2lzLiAKCgojIyBIb3BraW5zaSBmb3IgQ09MT05ZCgpHcmFiIHRoZSBob3BraW5zaSBkYXRhIGZvciBDT0xPTlkgaW5wdXQKCmBgYHtyfQpuZXcyY29sICU+JQogIGZpbHRlcihjb2xsZWN0aW9uID09ICJob3BraW5zaSIpICU+JQogIHNlbGVjdCgtc2FtcGxlX3R5cGUsIC1yZXB1bml0LCAtY29sbGVjdGlvbikgJT4lCiAgd3JpdGVfY3N2KCJjc3Zfb3V0cHV0cy9ob3BraW5zaV9nZW5vcy5jc3YiKQpgYGAKCkFuZCByZWFkIGluIHRoZSBvdXRwdXQgKHdpdGggdGhlIGNhdmVhdCB0aGF0IHdlIHByb2JhYmx5IGRvbid0IGhhdmUgdGhlIHBvd2VyIHRvIGFjdHVhbGx5IGRpc3Rpbmd1aXNoIHNpYnMgLSBsb3cgaHopCmBgYHtyfQpzaWJzIDwtIHJlYWRfY3N2KCIuLi9uZXdfYmFzZWxpbmVfZGF0YS9ob3BraW5zaV9jb2xvbnlfZGF0YS9ob3BraW5zaV9mb3Jfc3BwSUQuQmVzdENsdXN0ZXIuY3N2IikKCiMgb25seSB0aGUgaGlnaC1wcm9iYWJpbGl0eSBzaWJzCnNpYnMgJT4lCiAgZmlsdGVyKFByb2JhYmlsaXR5ID4gMC45NSkKYGBgCkJhc2VkIG9uIHRoYXQsIGl0IGxvb2tzIGxpa2UgdGhlcmUgaXMgb25lIHBhaXIgb2Ygc2licyBhbmQgb25lIGdyb3VwIG9mIGZvdXIgZnVsbC1zaWJzLgoKSG93IGRvIHRob3NlIGNvbXBhcmUgdG8gdGhlIGhvcGtpbnNpIHNhbXBsZXMgdGhhdCBoYWQgdGhlIHotc2NvcmVzPwoKYGBge3J9CmhvcGtfc2licyA8LSBzaWJzICU+JQogIGZpbHRlcihQcm9iYWJpbGl0eSA+IDAuOTUpICU+JQogIGZpbHRlcihDbHVzdGVySW5kZXggJWluJSBjKDIsIDMpKSAlPiUKICBsZWZ0X2pvaW4oLiwgaG9wa2luc2ksIGJ5ID0gYygiT2Zmc3ByaW5nSUQiID0gImluZGl2IikpICU+JQogIHNlbGVjdChDbHVzdGVySW5kZXgsIE9mZnNwcmluZ0lELCB6X3Njb3JlLCBTQU1QTEVfQ09NTUVOVFMpICU+JQogIHNlbGVjdChPZmZzcHJpbmdJRCkgJT4lCiAgcmVuYW1lKGluZGl2ID0gT2Zmc3ByaW5nSUQpCmBgYAoK